home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / PopupItem.C < prev    next >
C/C++ Source or Header  |  1990-12-21  |  3KB  |  138 lines

  1. //$PopupItem,PopupButton$
  2. #include "PopupItem.h"
  3. #include "ShadowItem.h"
  4. #include "DevBitmap.h"
  5. #include "Menu.h"
  6.  
  7. static int delay_cnt= 0;
  8.  
  9. //---- PopupButton ---------------------------------------------------------------
  10.  
  11. MetaImpl(PopupButton, (TP(menu), T(delay), 0));
  12.  
  13. PopupButton::PopupButton(int id, int dfltid, Menu *m, int dl) : Button(id)
  14. {
  15.     menu= m;
  16.     SetSelectedItem(dfltid);
  17.     delay= dl;
  18.     if (delay > 0)
  19.     SetFlag(eButtonIdle);
  20.     else
  21.     delay= 99999;
  22. }
  23.  
  24. PopupButton::~PopupButton()
  25. {
  26.     // SafeDelete(menu);
  27. }
  28.  
  29. Metric PopupButton::GetMinSize()
  30. {
  31.     Metric m;
  32.     Iter next(menu->GetCollection());
  33.     register VObject *vop;
  34.  
  35.     while (vop= (VObject*) next())
  36.     m.Merge(vop->GetMinSize());
  37.  
  38.     return m;
  39. }
  40.  
  41. int PopupButton::Base()
  42. {
  43.     return GetMinSize().base;
  44. }
  45.  
  46. void PopupButton::SetSelectedItem(int id)
  47. {
  48.     if (menu) {                     
  49.     VObject *old= 0, *clone, *theitem= menu->FindItem(id);
  50.     if (theitem) {
  51.         // optimize copying of the seleced item for the common cases
  52.         // tom@izf.tno.nl
  53.         if (theitem->IsKindOf(TextItem))
  54.         clone= menu->MakeMenuItem(theitem->AsString(), theitem->GetId());
  55.         else if (theitem->IsKindOf(ImageItem)) {
  56.         Bitmap *newb, *b= ((ImageItem*)theitem)->GetBitmap();
  57.         newb= new Bitmap(b->Size(), b->GetDevBitmap()->image, b->GetDepth());
  58.         clone= new ImageItem(theitem->GetId(), newb);
  59.         } else // last resort
  60.         clone= (VObject*) theitem->DeepClone();  
  61.         old= SetAt(0, (VObject*) clone);
  62.         menu->SetSelectedItem(id);
  63.     } else
  64.         old= SetAt(0, new TextItem("oops!"));
  65.     if (old)
  66.         delete old;
  67.     }                               
  68. }                      
  69.  
  70. int PopupButton::GetSelectedItem()
  71. {
  72.     if (menu) {
  73.     Rectangle r= menu->GetSelection();
  74.     if (r != gRect0) {
  75.         VObject *vop= menu->GetItem(r.origin.x, r.origin.y);
  76.         if (vop)
  77.         return vop->GetId();
  78.     }
  79.     }
  80.     return cIdNone;
  81. }
  82.  
  83. void PopupButton::DoOnItem(int m, VObject*, Point where)
  84. {
  85.     if (m == 1 || m == 2)
  86.     delay_cnt++;
  87.     else
  88.     delay_cnt= 0;
  89.     if ((delay_cnt > delay || m == 3 ) && menu) {
  90.     int id= menu->Show(where, this);
  91.     if (id != cIdNone) {
  92.         SetSelectedItem(id);
  93.         Control(GetId(), id, 0);
  94.     }
  95.     delay_cnt= 0;
  96.     }
  97. }
  98.  
  99. ostream& PopupButton::PrintOn(ostream &s)
  100. {
  101.     Button::PrintOn(s);
  102.     return s << menu SP;
  103. }
  104.  
  105. istream& PopupButton::ReadFrom(istream &s)
  106. {
  107.     Button::ReadFrom(s);
  108.     return s >> menu;
  109. }
  110.  
  111. //---- PopupItem ---------------------------------------------------------------
  112.  
  113. MetaImpl(PopupItem, (TP(pb), 0));
  114.     
  115. PopupItem::PopupItem(int id, int dfltid, Menu *m, Point g)
  116.                             : VObjectPair(0, 0, g)
  117. {
  118.     left= new TextItem("title:");
  119.     right= new ShadowItem(cIdNone, pb= new PopupButton(id, dfltid, m));
  120. }
  121.  
  122. PopupItem::PopupItem(int id, int dfltid, char *tit, Menu *m, Point g)
  123.                             : VObjectPair(0, 0, g)
  124. {
  125.     left= new TextItem(tit);
  126.     right= new ShadowItem(cIdNone, pb= new PopupButton(id, dfltid, m));
  127. }
  128.  
  129. void PopupItem::SetSelectedItem(int id)
  130. {
  131.     pb->SetSelectedItem(id);
  132. }
  133.  
  134. int PopupItem::GetSelectedItem()
  135. {
  136.     return pb->GetSelectedItem();
  137. }
  138.